﻿; ======================================================================================================================
;author: paomian
;Version: V1.0.0
; ======================================================================================================================

; ======================================================================================================================
; 编译声明（勿删）
; ======================================================================================================================

;@Ahk2Exe-AddResource *10 index.html
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\bootstrap.min.css
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\jquery.min.js
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\bootstrap.min.js
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\bootstrap\play-fill.svg
;@Ahk2Exe-AddResource *10 %A_ScriptDir%\assets\imgs\20231205093500.ico
; ======================================================================================================================
; 依赖与变量声明
; ======================================================================================================================

#Include lib/Class_SQLiteDB.ahk
#Include lib/EasyIni.ahk
#Include lib/Neutron.ahk

;数据库配置 全局变量
global DB := new SQLiteDB

;加载配置文件
vIni := class_EasyIni("config.ini")
global appName := vIni.system.appName
DBFileName := vIni.soft.sqlitePath
;默认表 全局变量
global defaultTable := vIni.soft.defaultTable


;html页面配置
global neutron := new NeutronWindow()
neutron.Load("index.html")
neutron.Gui("+LabelNeutron")

; ======================================================================================================================
; 主要处理流程
; ======================================================================================================================

;打开数据库
If !DB.OpenDB(DBFileName) {
   MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
   ExitApp
}

;获取总条数
totalCount := getTableTotalNum()

;数据量过大时，使用加载条
if (totalCount >= 1000) {
   Progress, ON , , , loading ..., 
   neutron.Show("w800 h400")
}

;查询表数据
dataIterators := getDbDataIterators()

;数据量过大时，使用加载条
if (totalCount >= 1000) {
   Progress, 90
}

;渲染thead
buildThead(dataIterators)
;渲染tbody
buildTbody(dataIterators)

;释放查询的结果
dataIterators.Free()

neutron.Show("w800 h600")
;进度条关闭
Progress, OFF

return

; ======================================================================================================================
; 事件监听
; ======================================================================================================================

;关闭页面时，退出
NeutronClose:
ExitApp
return

; 按ESC键时, 退出脚本:
#If isThisWinActive()
Esc::ExitApp

;禁用 鼠标右键
#If isThisWinActive()
RButton::
return

; ======================================================================================================================
; 方法
; ======================================================================================================================

;构建数据库数据对象 取值dataList[i,j]
buildDbDataList(Iterators) {
   dataList := Object()

   ArrayCount = 0
   If (Iterators.HasRows) {
      If (Iterators.Next(Row) < 1) {
         MsgBox, 16, %A_ThisFunc%, % "Msg:`t" . Iterators.ErrorMsg . "`nCode:`t" . Iterators.ErrorCode
         Return
      }
      Loop {
         ;循环字段，给对象赋值
         Loop, % Iterators.ColumnCount {
            ;二维数组
            dataList[ArrayCount, A_Index] := Row[A_Index]
         }
         ArrayCount += 1
         RC := Iterators.Next(Row)
      } Until (RC < 1)
   }

Return dataList
}

;构建HEAD
;neutron执行对象，Iterators迭代器对象
buildThead(Iterators) {
   titleList := Object()
   ;查出标题
   Loop, % Iterators.ColumnCount {
      titleList[0, A_Index] := Iterators.ColumnNames[A_Index]
   }

   ;渲染thead
   for row, data in titleList
   {
      tr := neutron.doc.createElement("tr")
      for col, cell in data
      {
         th := neutron.doc.createElement("th")
         th.innerText := cell
         tr.appendChild(th)
      }
      neutron.qs("#db_table_body>thead").appendChild(tr)
   }
}

;构建BODY
;neutron执行对象，Iterators迭代器对象
buildTbody(Iterators) {
   db_table_body := buildDbDataList(Iterators)

   html := ""
   for row, data in db_table_body
   {
      html .= "<tr>"
      for col, cell in data
         html .= neutron.FormatHTML("<td>{}</td>", cell)
      html .= "</tr>"
   }
   neutron.qs("#db_table_body>tbody").innerHTML := html
}


;获取表总数
getTableTotalNum() {
   SQL := "SELECT COUNT(*) FROM " defaultTable ";"
   SB_SetText("SQLite_GetTable : " . SQL)
   If !DB.GetTable(SQL, Result) {
      MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
   }

   If (Result.HasRows) {

      Result.Next(Row)
      Loop, % Result.ColumnCount {
         totalCount := Row[A_Index]
      }

   }
Return totalCount
}

;获取表数据迭代器
getDbDataIterators() {
   SQL := "SELECT * FROM " defaultTable ";"
   ;SB_SetText("Query : " . SQL)
   If !DB.Query(SQL, Iterators) {
      MsgBox, 16, SQLite Error: Query, % "Msg:`t" . Iterators.ErrorMsg . "`nCode:`t" . Iterators.ErrorCode
   }
Return Iterators
}

;重新加载Tbody
reloadTbody(neutron) {
 
   dbDataList := getDbDataIterators()

   buildTbody(dbDataList)

}

;判断是否当前窗口活动
isThisWinActive() {
   MouseGetPos, , , id
   WinGetTitle, title, ahk_id %id%
   if (appName = Title) {
      return 1
   } else {
      return 0
   }
   
}


;数据库执行SQL
execSqlWithDB(neutron, event, execSQL) {
   ;用户不输入时，直接返回
   if (execSQL = null) {
      return
   }
   If !DB.Exec(execSQL) {
      MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
   } else {
      SQL := "SELECT * FROM " defaultTable ";"
      SB_SetText("Query : " . SQL)
      If !DB.Query(SQL, RecordSet) {
         MsgBox, 16, SQLite Error: Query, % "Msg:`t" . RecordSet.ErrorMsg . "`nCode:`t" . RecordSet.ErrorCode
      }

      reloadTbody(neutron)
   } 

   
}
